﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Modelo;
using AccesoDatos;
using System.Text.RegularExpressions;

namespace Negocio
{
    public static class ControladorProducto
    {
        public static List<Producto> ProductosParaSemana()
        {
            
            List<Comida> comidas = ControladorMenuDiario.GetComidaHastaDomingo(DateTime.Now.Date);
            List<Producto> productos;
            DescontarAlmacen(comidas);
            productos = SeleccionarCantidadProductos(comidas);
            CalcularPrecios(productos);
            EliminarProductosDiarios(productos);
            return productos;
        }
        private static DateTime BuscarElUltimoSabado()
        {
            DateTime fecha = DateTime.Now.Date;
            while (ControladorFecha.dayOfWeekLarge(fecha) != "domingo")
            {
                fecha = fecha.AddDays(-1);
            }
            return fecha;
        }
        private static void EliminarProductosDiarios(List<Producto> productos)
        {
            List<ProductoDiario> productosDiarios = ControladorProductoDiario.ObtenerProductosHastaDomingo(BuscarElUltimoSabado());
            for (int i = 0; i < productos.Count; i++)
            {
                if (estaProductoEnListaDiaria(productos[i].Nombre, productosDiarios))
                {
                    productos.Remove(productos[i]);
                    i--;
                }
                    
            }
                
        }

        private static bool estaProductoEnListaDiaria(string nombre,List<ProductoDiario> productosDiarios)
        {
            foreach (ProductoDiario productoDiario in productosDiarios)
            {
                if (productoDiario.Nombre == nombre)
                    return true;
            }

        

            return false;
        }
public static List<Producto> Productos()
        {
            return AccesoDatos.BDProducto.Productos();
        }
        private static void CalcularPrecios(List<Producto> productos)
        {
            foreach (Producto producto in productos)
            {
                producto.Precio = (producto.Precio) * producto.Cantidad;
            }
        }
        private static List<Producto> SeleccionarCantidadProductos(List<Comida> comidas)
        {
            List<Producto> Productos = new List<Producto>();
            foreach (Comida comida in comidas)
            {
                if (comida.recetas.Ingredientes != null)
                {
                    foreach (Ingrediente ingrediente in comida.recetas.Ingredientes)
                    {
                        if (!ProductoEsta(ingrediente, Productos))
                        {
                            ingrediente.producto.Cantidad = (ingrediente.Cantidad) * comida.CantidadAdultos / comida.recetas.Comensales + (ingrediente.Cantidad) * comida.CantidadNiños / (2 * comida.recetas.Comensales);
                            Productos.Add(ingrediente.producto);
                        }

                        else
                            AumentarCantidad(ingrediente, Productos, comida);
                    }
                }
                
            }
            return Productos;
        }
        private static void DescontarAlmacen(List<Comida> comidas)
        {
            foreach (Comida comida in comidas)
            {
                if (comida.recetas.Ingredientes != null)
                {
                    foreach (Ingrediente ingrediente in comida.recetas.Ingredientes)
                    {
                        ingrediente.producto.Cantidad = 0;
                    }
                }
                
            }
        }

        private static void AumentarCantidad(Ingrediente ingrediente, List<Producto> Productos,Comida comida)
        {
            for (int i = 0; i < Productos.Count; i++)
            {
                if (Productos[i].Nombre == ingrediente.producto.Nombre)
                {
                    Productos[i].Cantidad = Productos[i].Cantidad + (ingrediente.Cantidad) * comida.CantidadAdultos/comida.recetas.Comensales + (ingrediente.Cantidad) * comida.CantidadNiños / (2*comida.recetas.Comensales);
                }
            }
        }

        private static bool ProductoEsta(Ingrediente ingrediente, List<Producto> Productos)
        {
            foreach (Producto ProductoUnico in Productos)
            {
                if (ProductoUnico.Nombre == ingrediente.producto.Nombre)
                {
                    return true;
                }
                    
            }
            return false;
        }
        public static Producto ObtenerProducto(string nombre)
        {
            Producto product = new Producto();
            product = BDProducto.ObtenerProductPorNombre(nombre);
            return product;
        }
        public static List<Producto> CargarTodosLosProductos()
        {
            List<Producto> lista = new List<Producto>();
            lista = BDProducto.Productos();
            return lista;
        }
        public static void CambiarPrecio(float cantidadAnterior, Producto producto)
        {
            producto.Precio = producto.Cantidad * producto.Precio / cantidadAnterior;
        }
        public static Producto AgregarProducto(Producto product)
        {
            product = BDProducto.InsertarProducto(product);
            return product;
        }
        public static void EliminarProducto(Producto product)
        {
            BDProducto.EliminarProducto(product);

        }
        public static List<Producto> BuscarProducto(string busqueda,List<Producto> products)
        {
            
            String[] words = null;
            words = SepararPalabras(busqueda);
            List<Producto> resp = new List<Producto>();
            if (products != null && products.Count != 0)
            {
                if (words != null && words.Length != 0)
                {
                    foreach (String word in words)
                    {
                        foreach (Producto prod in products)
                        {
                            String name = prod.Nombre.ToLower();
                            String description = prod.Detalle.ToLower();
                            String lword = word.ToLower();
                            if (!String.IsNullOrEmpty(word) && (name.Contains(lword) || description.Contains(lword)))
                            {
                                resp.Add(prod);
                            }
                        }
                    }
                }
            }
            else
            {
                throw new Exception("No existen productos registrados");
            }
            return resp;
        }
        public static String[] SepararPalabras(string busqueda)
        {
            String[] words = null;
            if (!String.IsNullOrEmpty(busqueda))
            {
                words = busqueda.Split(' ');
            }
            return words;
        }
        public static void EditarProducto(Producto product)
        {
            try
            {
                BDProducto.EditarProducto(product);
            }
            catch (Exception)
            {
                throw;
            }


        }
        public static DateTime FechaPrimeraVezUsado(DateTime dateTime, string producto)
        {
            return AccesoDatos.BDProducto.getFechaDiario(dateTime, producto);
        }
    }
}
